package com.shujia.day18;

import com.mysql.jdbc.Driver;

import java.sql.*;

public class Demo01MysqlCon {
    public static void main(String[] args) throws SQLException {
        /*
            TODO:使用Java操作Mysql中的数据
                jdbc => Java Database Connector
              1.  如果需要连接Mysql => 从网站获取对应版本的Mysql连接Jar包
                    mysql-connector-java-5.1.49.jar
              2.  当获取到后，在当前项目中创建lib目录，再将jar包添加到该目录中
                     (注意：jar包中所包含的都是类编译后的.class文件，并按照包路径进行保存)
              3.  为了让IDEA能够识别到jar包，那么需要将jar包添加到项目依赖中
                    选中jar 包，右键 -> add as library
              4.  可以通过双击，打开jar包，获取一些类的信息，但是该类的代码，仅仅是通过.class文件反编译
                     后的一些信息，并不是真实的源码，如果想要查看，需要在idea中下载源码

              对于要使用的一些服务，需要先检测是否可用
         */

        /*
            TODO:如何使用Java中的jdbc连接到Mysql数据库
                套路：
                    1.加载驱动 -> 告诉当前程序，所使用的数据库连接是谁
                    2.创建连接 -> 通过给定一些URL 用户名 密码 获取数据库连接对象
                    3.获取操作对象  -> 通过操作对象，可以执行SQL等操作
                    4.编写SQL并执行
                    5.如果当SQL有返回结果，那么需要对结果进行遍历
                    6.对操作对象以及连接进行关闭操作
                具体通过哪些类来去实现？
                    1.在java.sql包下有一些类可以完成对应的操作
                    2.DriverManager 是用于管理驱动的 =>
                            2.1 registerDriver方法可以注册驱动
         */
        // 要求传入一个Driver的对象
        //   Java中的Driver是一个接口 不能直接创建 => 寻找子实现类
        //     com.mysql.jdbc.Driver  => 第三方包所提供的 (最常用)
        //     org.gjt.mm.mysql.Driver => 第三方包所提供的 (需要知道)
        // TODO 1.加载驱动
        DriverManager.registerDriver(new Driver());

        // TODO 2.创建连接 -> 通过给定一些URL 用户名 密码 获取数据库连接对象
        //   JDBC的URL: jdbc:数据库类型://ip:3306/database?参数信息
        //    Connection对象 具体是指哪个类 => ConnectionImpl
        //     useSSL=false => 关闭SSL验证 作为参数 其中useSSL为参数名  false为参数值
        //    当如果要设置连接的编码格式为 UTF8 => useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
        //
//        Connection connection = DriverManager.getConnection("jdbc:mysql://master:3306/bigdata_30?useSSL=false", "root", "123456");
        Connection connection = DriverManager.getConnection("jdbc:mysql://master:3306/bigdata_30?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai", "root", "123456");

        // TODO 3.获取操作对象  -> 通过操作对象，可以执行SQL等操作
        Statement statement = connection.createStatement();

        // TODO 4.编写SQL并执行
        String sql = "select * from students";
        ResultSet resultSet = statement.executeQuery(sql);

        /*
           TODO 5.如果当SQL有返回结果，那么需要对结果进行遍历
              ResultSet  表示数据库结果集的数据表
                  ResultSet对象保持一个光标指向其当前的数据行。
                    最初，光标位于第一行之前。 next方法将光标移动到下一行，
                     并且由于在ResultSet对象中没有更多行时返回false ，
                        因此可以在while循环中使用循环来遍历结果集。
         */
//        boolean next = resultSet.next();  // 下一个光标指向的位置是否有数据
        while (resultSet.next()){
            // 当下一个光标有数据时，需要获取其中的数据
            String id = resultSet.getString("id");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            String gender = resultSet.getString("gender");
            String clazz = resultSet.getString("clazz");
            System.out.println(id+"\t"+name+"\t"+age+"\t"+gender+"\t"+clazz);
        }

        // TODO 6.对操作对象以及连接进行关闭操作
        statement.close();
        connection.close();

        /*
            Mon May 13 10:50:56 CST 2024 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements
                    SSL connection must be established by default if explicit option isn't set.
                        For compliance with existing applications not using SSL the verifyServerCertificate
                            property is set to 'false'. You need either to explicitly disable SSL by setting
                                useSSL=false, or set useSSL=true and provide truststore for server
                                    certificate verification
         */
    }
}
